package com.wjm.api.SynchronizePackage;

/**
 * Data:2022年07月28日
 * Author:wjm
 * Content: 互斥锁
 *
 *
 *     1）互斥锁一定要锁的是同一个对象，如果不是同一个对象，是不具备同步效果的
 *
 *     2）synchronized修饰的代码片段和非synchronized修饰的代码片段之间是不存在互斥关系的
 *
 *     3）当多个代码片段被synchronized块修饰后，这些同步块的同步监听器对象又是同一个时,这些代码片段就是互斥的。
 *     多个线程不能同时在这些方法中运行。
 *
 *     4）静态方法与非静态方法同时声明了synchronized，他们之间是非互斥关系的。
 *     原因在于，静态方法锁的是类对象而非静态方法锁的是当前方法所属对象。
 *
 */
public class SynchronizeDemo3 {
    public static void main(String[] args) {
        //创建Foo对象
        Foo foo = new Foo();

        //创建线程
        Thread t1 = new Thread(){
            @Override
            public void run() {
                foo.B();
            }
        };

        //创建线程
        Thread t2 = new Thread(){
            @Override
            public void run() {
                foo.A();
            }
        };


        //启动线程
        t1.start();
        t2.start();

    }
}

class Foo{
    public synchronized void A(){
        try {
            System.out.println("A方法开始执行");
            Thread.sleep(2000);
            System.out.println("A方法执行完毕");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void B(){
        try {
            System.out.println("B方法开始执行");
            Thread.sleep(2000);
            System.out.println("B方法执行完毕");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


}